//配置axios
import axios from "axios";
import ElementUI from "element-ui";
import router from "../router";
import nprogress from "nprogress"
//create会将axios当成一个原型
let server = axios.create({
  baseURL: "/api", //基础地址
  timeout: 1000 * 20,
  withCredentials: true, //允许本地携带认证给服务器 cookie传递需要开启这个属性
});
//响应拦截器  这里不放行那边的.then就请求不到数据
 
//拦截器不是组件
server.interceptors.response.use(function (config) {
  nprogress.done()
  // console.log(config); //config是响应设置
//页面重复导航死循环处理 

  //接口有个相同的地方就是 只要数据响应是错误的state 都是false
  let { data } = config; //把后台响应的数据从config中结构出来
  //由于获取验证码这个接口，返回的字段只有img没有state,所以我们要排除获取验证码这个接口

   //如果后台返回1004状态码，则表示token过期，返回10022表示后台登入态失效
  
  if(data.code==='1004'||data.code==='10022'){
    localStorage.removeItem('bd-token')
    // 刷新页面 
    location.reload();
    router.push('/login')
  }

   if (!data.state && config.config.url !== "/users/getCaptcha" && config.config.url !== "/order/query_order_status") {
    //表示数据响应了，但是有错误

    ElementUI.MessageBox.alert(data.msg, "错误", {
      confirmButtonText: "确定",
      type: "error",
    });

    //直接return false不放行
    //验证码错误进入这个判断这里没有return值所以res为undefined

    return config; //返回去的目的为了不让项目直接报错
  } else {
    //如果要让拦截器放行需要return config
    return config;
  }
});

//请求拦截器
server.interceptors.request.use(function(config){
   nprogress.start()
    // console.log(config); congfig是请求对象
    //除了登入 获取验证码 校验验证码
    //不需要添加token的路径
    let excludePath=["/users/login","/users/getCaptcha","/users/verifyCaptcha"]
    //config.url是拦截到的对象的请求url
    //如果上述排除需要添加token的路径中 包含了当前请求对象中的url路径就直接放行
    let flag=excludePath.includes(config.url)
    if(flag){
        return config
    }else{
        //将token携带在请求头中
        // 从本地获取token
        let token=localStorage.getItem("bd-token")
        config.headers.authorization=token;
        return config
    }
})
export default server;
